//请定义一个队列并实现函数 max_value 得到队列里的最大值，要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都
//是O(1)。
//
// 若队列为空，pop_front 和 max_value 需要返回 -1
//
// 示例 1：
//
// 输入:
//["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
//[[],[1],[2],[],[],[]]
//输出: [null,null,null,2,1,2]
//
//
// 示例 2：
//
// 输入:
//["MaxQueue","pop_front","max_value"]
//[[],[],[]]
//输出: [null,-1,-1]
//
//
//
//
// 限制：
//
//
// 1 <= push_back,pop_front,max_value的总操作数 <= 10000
// 1 <= value <= 10^5
//
//
// Related Topics 设计 队列 单调队列 👍 479 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
class MaxQueue {
    queue: number[]
    max_queue: number[]

    constructor() {
        this.queue = [];
        this.max_queue = [];
    }

    max_value(): number {
        if (!this.queue.length) return -1;
        return this.max_queue[0];
    }

    push_back(value: number): void {
        this.queue.push(value);
        while (this.max_queue.length && this.max_queue[this.max_queue.length - 1] < value) {
            this.max_queue.pop();
        }
        this.max_queue.push(value);
    }

    pop_front(): number {
        if (!this.queue.length) return -1;
        let front = this.queue.shift()
        if (front === this.max_queue[0]) {
            this.max_queue.shift();
        }
        return front;
    }
}


/**
 * Your MaxQueue object will be instantiated and called as such:
 * var obj = new MaxQueue()
 * var param_1 = obj.max_value()
 * obj.push_back(value)
 * var param_3 = obj.pop_front()
 */
//leetcode submit region end(Prohibit modification and deletion)
